﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VKontakteClient
{
    /// <summary>
    /// Класс описывающий отношения с человеком
    /// </summary>
    public class Relation
    {
        /// <summary>
        /// Перегруженное конвертирование в строку
        /// </summary>
        /// <param name="self">Пол "себя"</param>
        public string ToString(Gender self)
        {
            var relation = this;
            var gender = self;
            string Result = "";
            if (relation.With == null)
            {
                if (gender == Gender.Female)
                {
                    switch (relation.RelationType)
                    {
                        case RelationType.Searching: Result = "В активном поиске..."; break;
                        case RelationType.Married: Result = "Замужем"; break;
                        case RelationType.HaveAFriend: Result = "Есть друг"; break;
                        case RelationType.Free: Result = "Свободна"; break;
                        case RelationType.AllBad: Result = "Всё сложно"; break;
                        case RelationType.Affianced: Result = "Помовлена"; break;
                    }
                }
                else
                {
                    switch (relation.RelationType)
                    {
                        case RelationType.Searching: Result = "В активном поиске..."; break;
                        case RelationType.Married: Result = "Женат"; break;
                        case RelationType.HaveAFriend: Result = "Есть подруга"; break;
                        case RelationType.Free: Result = "Свободен"; break;
                        case RelationType.AllBad: Result = "Всё сложно"; break;
                        case RelationType.Affianced: Result = "Помовлен"; break;
                    }
                }
            }
            else
            {
                if (gender == Gender.Female)
                {
                    switch (relation.RelationType)
                    {
                        case RelationType.Married: Result = "Замужем за "; break;
                        case RelationType.HaveAFriend: Result = "Встречается с "; break;
                        case RelationType.AllBad: Result = "Всё сложно с "; break;
                        case RelationType.Affianced: Result = "Помовлена "; break;
                    }
                }
                else
                {
                    switch (relation.RelationType)
                    {
                        case RelationType.Married: Result = "Женат на "; break;
                        case RelationType.HaveAFriend: Result = "Встречается с "; break;
                        case RelationType.AllBad: Result = "Всё сложно с"; break;
                        case RelationType.Affianced: Result = "Помовлен с "; break;
                    }
                }
                Result += relation.With.ToString();
            }
            return Result;
        }

        /// <summary>
        /// Перегруженное получение хэшкода
        /// </summary>
        public override int GetHashCode()
        {
            return _type.GetHashCode() ^ _with.GetHashCode();
        }

        /// <summary>
        /// Перегруженный метод сравнения отношений
        /// </summary>
        /// <param name="obj">Объект с которым сравнивать. Подразумеваются отношения.</param>
        /// <returns>True если одинаковые, иначе разные</returns>
        public override bool Equals(object obj)
        {
            var x = obj as Relation;
            if (x == null) return false;
            return (x.RelationType == this.RelationType) && (x.With == this.With);
        }

        /// <summary>
        /// Приватное поле хранения типа отношений
        /// </summary>
        private RelationType _type;

        /// <summary>
        /// Свойство - тип отношений
        /// </summary>
        public RelationType RelationType
        {
            get { return _type; }
            set { _type = value; if (_type == RelationType.Free || _type == RelationType.Searching) With = null; }
        }

        /// <summary>
        /// Приватное поле хранения человека с которым отношение
        /// </summary>
        private Human _with;

        /// <summary>
        /// Свойство - человек с которым отношение
        /// </summary>
        public Human With
        {
            get
            {
                return _with;
            }
            set
            {
                _with = value;
                if (RelationType == RelationType.Free || RelationType == RelationType.Searching)
                    _with = null;
            }
        }
    }
}
